#include "file_loger.hpp"
#include <unistd.h>
#include <stdio.h>

namespace lxz
{

    file_loger::file_loger()
        : fp_(nullptr), enable_flush_(false), in_queue_(std::queue<std::string>()), out_queue_(std::queue<std::string>())
    {
    }

    file_loger::~file_loger()
    {
        looping_ = false;

        enable_flush_ = true;
        cond_var_.notify_all();

        if (thread_)
        {
            thread_->join();
            thread_ = nullptr;
        }

        if (fp_)
        {
            fflush(fp_);
            fclose(fp_);
            fp_ = nullptr;
        }
    }

    int32_t file_loger::append(log_level level, std::string log)
    {
        std::unique_lock<std::mutex> lock(mutex_); // 写队列的线程获得互斥量

        if (level < level_)
        {
            return -1;
        }

        if (log.empty())
        {
            return 0;
        }

        in_queue_.push(std::move(log));

        // 使能flush并激发条件变量
        enable_flush_ = true;
        cond_var_.notify_all();

        return 0;
    }

}